package org.custom.spring.boot.datasource.service;

import org.custom.spring.boot.datasource.entity.datasource.CustomDataSourceProperties;
import org.custom.spring.boot.datasource.entity.datasource.DynamicDatasourceSelection;
import org.custom.spring.boot.datasource.exception.TipException;

import javax.sql.DataSource;
import java.sql.Connection;

/**
 * 动态数据源相关接口
 *
 * @author 李坤
 * @date 2022/3/31 11:16
 */
public interface DynamicDatasourceService {

    /**
     * 获取给定数据源的连接
     *
     * @param dataSource 数据源
     *
     * @return 连接
     */
    Connection obtainConnection(DataSource dataSource);

    /**
     * 获取默认数据源类型
     *
     * @return 数据源类型
     */
    Class<? extends DataSource> getDefaultDataSourceClass();

    /**
     * 设置默认数据源类型
     *
     * @param dataSourceClass 数据源类型
     */
    void setDefaultDataSourceClass(Class<? extends DataSource> dataSourceClass);

    /**
     * 根据数据源名称获取数据源
     *
     * @param dataSourceKey 数据源名称
     *
     * @return 数据源
     */
    DataSource getDataSource(String dataSourceKey);

    /**
     * 动态添加数据源
     * <p>
     * 注：数据源名称不能为空
     *
     * @param dataSourceProperties 数据源配置
     */
    void appendDataSource(CustomDataSourceProperties dataSourceProperties);

    /**
     * 根据给定的数据源配置属性构建生成数据源对象
     *
     * @return 数据源对象
     */
    DataSource generateDataSource(CustomDataSourceProperties dataSourceProperties);

    /**
     * 重新设置默认数据源配置
     *
     * @param dataSourceProperties 数据源配置
     *
     * @return 是否成功
     *
     * @throws TipException 数据源配置异常
     */
    boolean resetDefaultDataSource(CustomDataSourceProperties dataSourceProperties);

    /**
     * 校验是否存在可用的数据源
     *
     * @param datasourceSelection 数据源数据
     */
    void verifyDynamicDataSourceSelection(DynamicDatasourceSelection datasourceSelection);
}
